// 用户模块
const express=require('express')
const pool=require('../pool')
const router=express.Router()
const jwt=require('jsonwebtoken')
const key='user key' //秘钥
module.exports=router
// 用户注册接口
router.post('/register',(req,res,next)=>{
	const {sname,spwd,phone,email} = req.body
	// 非空验证
	let code=400
	for(let key in req.body){
		code++
		if(!req.body[key]) {
			res.send({code,msg:`${key} invalid`})
			return
		}
	} 
	// 服务器端验证
	// 验证用户名是否唯一
	pool.query('SELECT sid FROM su_user WHERE sname=?',[sname],(err,result)=>{
		if(err){
			next(err)
			return 
		}
		if(result.length!=0){
			res.send({code:405,msg:'uname exists'})
			return
		} 
		// 验证邮箱
		if(!/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(email)){
			res.send({code:406,msg:'email invaild'})
			return
		} 
		pool.query('SELECT sid FROM su_user WHERE email=?',[email],(err,result)=>{
			if(err){
				next(err)
				return 
			} 
			if(result.length!=0){
				res.send({code:407,msg:'email exists'})
				return
			} 
			// 验证手机
			if(!/^1[3-9]\d{9}$/.test(phone)){
				res.send({code:408,msg:'phone invaild'})
				return
			} 
			pool.query('SELECT sid FROM su_user WHERE phone=?',[phone],(err,result)=>{
				if(err){
					next(err)
					return 
				}
				if(result.length!=0) {
					res.send({code:409,msg:'phone exists'})
					return
				}
				// 通过验证，插入数据
				pool.query('INSERT INTO su_user(sname,password,phone,email) VALUES(?,md5(?),?,?)',[sname,spwd,phone,email],(err,result)=>{
					if(err){
						next(err)
						return 
					}
					// 生成token
					res.send({code:200,message:'register success',sid:result.insertId})
				})
			})
		})
	})
})
// 用户登录接口
router.post('/login',(req,res,next)=> {
	const {sname,spwd} = req.body
	let code=400
	// 非空验证
	for(let key in req.body){
		code++
		if(!req.body[key]){
			res.send({code,message:`${key} invalied`})
			return
		}
	}
	pool.query('SELECT * FROM su_user WHERE sname=? && password=md5(?)',[sname,spwd],(err,result)=>{
		if(err){
			next(err)
			return 
		}
		// 登录成功
		if(result.length!=0){
			// 生成token
			const payload={
				userid:result[0].sid,
				sname:result[0].sname,
				avatar:result[0].avatar,
				exp:new Date().getTime()+1000*60*20 //20分钟后过期
			}
			let token=jwt.sign(payload,key)
			res.send({code:200,message:'login success',token})
		}else {
			// 登录失败
			res.send({code:403,message:'sname or spwd error!'})
		}
	})
})
// 验证用户名是否可用
router.get('/checkName/:sname',(req,res,next)=> {
	const sname=req.params.sname
	// 非空验证
	if(!sname){
		res.send({code:401,msg:'sname null'})
		return
	}
	pool.query('SELECT sid FROM su_user WHERE sname=?',[sname],(err,result)=>{
		if(err){
			next(err)
			return 
		}
		if(result.length==0){
			res.send({code:200,message:'non-exists'})
		}else{
			res.send({code:402,message:'exists'})
		}
	})
})
// 验证邮箱是否可用
router.get('/checkEmail',(req,res,next)=>{
	const email=req.query.email
	// 非空验证 验证邮箱的格式
	if(!email || !/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(email)){
		res.send({code:401,msg:'email invaild'})
		return 
	}
	pool.query('SELECT sid FROM su_user WHERE email=?',[email],(err,result)=>{
		if(err){
			next(err)
			return 
		}
		if(result.length==0){
			res.send({code:200,message:'non-exists'})
		}else{
			res.send({code:402,message:'exists'})
		}
	})
})
//验证手机号是否可用
router.get('/checkPhone/:phone',(req,res,next)=>{
	const phone=req.params.phone
	// 非空验证  格式验证
	if(!phone || !/^1[3-9]\d{9}$/.test(phone)){
		res.send({code:401,msg:'phone invaild'})
		return 
	}
	pool.query('SELECT sid FROM su_user WHERE phone=?',[phone],(err,result)=>{
		if(err){
			next(err)
			return
		}
		if(result.length==0){
			res.send({code:200,message:'non-exists'})
		}else{
			res.send({code:401,message:'exists'})
		}
	})
})
// 修改密码
router.put('/put/password',(req,res,next)=>{
	const {sid,spwd,Npwd} = req.body
	let code=400
	// 非空验证
	for(let key in req.body){
		code++
		if(!req.body[key]){
			res.send({code,message:`${key} invaild`})
			return
		}
	}
	// 验证是否与原密码相同
	pool.query('SELECT sid FROM su_user WHERE sid=? && password=md5(?)',[sid,spwd],(err,result)=>{
		if(err){
			next(err)
			return 
		}
		if(result.length!=0){
			// 原密码验证正确
			pool.query('UPDATE su_user SET password=md5(?) WHERE sid=?',[Npwd,sid],(err,result)=>{
				if(err){
					console.log(err)
					return
				}
				res.send({code:200,message:'update success'})
			})
		}else{
			// 原密码错误
			res.send({code:403,message:'spwd error'})
		}
	})
})
// 查看用户的个人信息
router.get('/info',(req,res,next)=>{
	const token=req.headers.usertoken
	if(!token) return 
	const userobj=jwt.verify(token,key)
	pool.query('SELECT sid,sname,user_name,sex,phone,email,detail,avatar,total FROM su_user WHERE sid=?',[userobj.userid],(err,result)=>{
		if(err){
			next(err)
			return 
		}
		res.send({code:200,message:'操作成功',info:result[0]})
	})
})
// 用户修改个人信息
router.put('/update/info',(req,res,next)=> {
	const sid=req.query.sid
	pool.query('UPDATE su_user set ? WHERE sid=?',[req.body,sid],(err,result)=>{
		if(err){
			next(err)
			return
		}
		if(result.changedRows!=0){
			res.send({code:200,message:'个人信息修改成功'})
		}else{
			res.send({code:401,message:'修改失败'})
		}
	})
})
// 通过邮箱找回密码
router.put('/resetpwd/email',(req,res,next)=>{
	const email=req.query.email
	const {npwd} = req.body
	pool.query('SELECT sid FROM su_user WHERE email=?',[email],(err,result)=>{
		if(err){
			next(err)
			return 
		}
		if(result.length==0){
			res.send({code:401,msg:'email non-exists'})
			return 
		}
		pool.query('UPDATE su_user SET password=md5(?) WHERE email=?',[npwd,email],(err,result)=>{
			if(err){
				next(err)
				return
			}
			res.send({code:200,msg:'密码设置成功'})
		})
	})
})
// 通过手机号找回密码
router.put('/resetpwd/phone/:phone',(req,res,next)=>{
	const phone=req.params.phone
	const newPwd=req.body.npwd
	// 验证是否存在
	pool.query('SELECT sid FROM su_user WHERE phone=?',[phone],(err,result)=>{
		if(err){
			next(err)
			return
		}
		// 手机号不存在
		if(result.length==0){
			res.send({code:401,msg:'phone non-exists'})
			return
		}
		// 手机号存在
		pool.query('UPDATE su_user SET password=md5(?) WHERE phone=?',[newPwd,phone],(err,result)=>{
			if(err){
				next(err)
				return
			}
			res.send({code:200,message:'密码设置成功!'})
		})
	})
})
// 获取用户的收货地址
router.get('/user_address',(req,res,next)=>{
	const sid = req.query.sid //用户Id
	pool.query('SELECT * FROM su_user_address WHERE sid=?',[sid],(err,result)=> {
		if(err){
			next(err)
			return
		}
		res.send({status:'OK',statusCode:200,result})
	})
})
// 用户添加收货地址
router.post('/add_address',(req,res,next)=>{
	const {aname,phone,address,deaddress,userId} = req.body
	// 非空验证
	let code=400
	for(let key in req.body){
		code++
		if(!req.body[key]){
			res.send({status:'err',code,details:`${key} not null ! `})
			return
		}
	}
	// 验证手机号格式
	const phoneReg=/^1[3-9]\d{9}$/
	if(!phoneReg.test(phone)) {
		res.send({status:'err',code:405,details:'手机号格式不正确'})
		return
	}
	pool.query('INSERT INTO su_user_address(aname,phone,addr,deaddress,sid) VALUES(?,?,?,?,?)',[aname,phone,address,deaddress,userId],(err,result)=>{
		if(err){
			next(err)
			return
		}
		res.send({status:'OK',code:200,details:'插入成功'})
	})
})
// 更改收货地址是否为默认地址
router.put('/is_default',(req,res,next)=>{
	let {userId,is_default,addressId} = req.body
	// 如果是false 就保存0  如果是true 就保存1
	is_default = is_default ? 1:0
	pool.query('UPDATE su_user_address SET is_default=? WHERE sid=? && aid=?',[is_default,userId,addressId],(err,result)=>{
		if(err){
			next(err)
			return
		}
		res.send({status:'OK',code:200,details:'修改成功'})
	})
})